import os
import json
from typing import Optional

def get_chrome_download_directory(
    profile: str = "Default",
    alternative_keys: tuple = ("savefile", "download")
) -> Optional[str]:
    """
    获取 Chrome 浏览器的默认下载目录。

    Args:
        profile: Chrome 用户配置名称（如 "Default" 或 "Profile 1"）
        alternative_keys: 尝试从哪些 JSON key 中获取下载目录（按优先级顺序）

    Returns:
        str: 下载目录路径（如果找到）
        None: 如果未找到或出错

    Raises:
        FileNotFoundError: 如果 Chrome 用户数据目录不存在
        json.JSONDecodeError: 如果 Preferences 文件不是有效的 JSON
    """
    try:
        # 1. 获取 Chrome 用户数据目录
        local_app_data = os.getenv("LOCALAPPDATA")
        if not local_app_data:
            raise FileNotFoundError("LOCALAPPDATA 环境变量未找到（非 Windows 系统？）")

        chrome_user_data = os.path.join(local_app_data, "Google", "Chrome", "User Data")
        if not os.path.exists(chrome_user_data):
            raise FileNotFoundError(f"Chrome 用户数据目录不存在: {chrome_user_data}")

        # 2. 构建 Preferences 文件路径
        preferences_path = os.path.join(chrome_user_data, profile, "Preferences")
        if not os.path.exists(preferences_path):
            raise FileNotFoundError(f"Preferences 文件不存在: {preferences_path}")

        # 3. 读取并解析 JSON 文件
        with open(preferences_path, "r", encoding="utf-8") as f:
            preferences = json.load(f)

        # 4. 尝试从多个可能的键中获取下载目录
        for key in alternative_keys:
            if key in preferences:
                config = preferences[key]
                if isinstance(config, dict):
                    directory = config.get("default_directory")
                    if directory and os.path.isabs(directory):  # 确保是绝对路径
                        return directory

        return None

    except (FileNotFoundError, json.JSONDecodeError) as e:
        print(f"错误: {e}")
        return None
    except Exception as e:
        print(f"未知错误: {e}")
        return None


# 使用示例
if __name__ == "__main__":
    download_dir = get_chrome_download_directory()
    if download_dir:
        print(f"Chrome 默认下载目录: {download_dir}")
    else:
        print("无法获取 Chrome 下载目录")